/*
 * XMLDocument.h
 *
 *  Created on: 2010-3-24
 *      Author: wenjian
 */

#ifndef XMLDOCUMENT_H_
#define XMLDOCUMENT_H_
#include <vector>
#include <bits/stl_algo.h>
#include "XMLElement.h"
#include "XMLAttribute.h"

using namespace std;

namespace Try {

  /**
   * XML文档接口
   */
  class XMLDocument {
    public:
      XMLDocument();
      virtual ~XMLDocument();

      /**
       * 定义编码方式，当前只支持UTF-8
       */
      enum Encoding{
        UNKNOW,
        UTF8
      };

      /**
       * 返回根XMLElement元素
       */
      virtual XMLElement* getRootElement()const;

      /**
       * 设置根XMLElement元素
       */
      virtual XMLElement* setRootElement(XMLElement* e);

      /**
       * 创建一个XMLElement元素
       */
      virtual XMLElement* newElement(const char* name);

      /**
       * 创建一个XMLAttribute属性
       */
      virtual XMLAttribute* newAttribute(const char* name, const char* value);

      /**
       * 保存为文件
       */
      virtual bool save(const char* filename, Encoding encoding=UNKNOW)=0;

      /**
       * 保存为文件
       */
      virtual const char* toXML(XMLDocument::Encoding encoding=UNKNOW)=0;

      /**
       * 载入XML串文档
       */
      virtual bool loadXML(const char* xml)=0;

      /**
       * 载入XML文档
       */
      virtual bool loadFile(const char* filename)=0;


    protected:
      /** 所有元素 */
      std::vector<XMLElement*> allElements;

      /** 所有属性 */
      std::vector<XMLAttribute*> allAttributes;

      /** 根元素 */
      XMLElement* rootElement;

      /**
       * 检查是否已经包含此元素
       */
      bool containsElement(XMLElement* e){
        return find(allElements.begin(), allElements.end(), e)!=allElements.end();
      }
  };

}

#endif /* XMLDOCUMENT_H_ */
